package com.zt.jwt;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.Date;

public class JwtUtils {

    // 密钥，实际应用中应妥善保管
//    private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    static String secretString = "cuAihCz53DZRjZwbsGcZJ2Ai6At+T142uphtJMsk7iQ";     //随机字符串
    private static final Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));

    /**
     *
     * @param username String类型的用户id
     * @param expiration_time 过期时间
     * @return 返回token
     */
    public static String generateToken(String username,Long expiration_time) {
        return Jwts.builder().
                setSubject(username)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expiration_time))
                .signWith(key)
                .compact();
    }


    /**
     * 获取用户id
     * @param token 使用token获取id
     * @return 返回String类型的用户id
     */
    public static String getUsernameFromToken(String token) {
        Claims claims = parseToken(token);
        if (claims != null) {
            return claims.getSubject();
        }
        return null;
    }


    /**
     *  验证用户的token是否过期
     * @param token 使用前端获取的token
     * @return 返回是否有效
     */
    public static boolean validateToken(String token) {
        return parseToken(token) != null &&!isTokenExpired(token);
    }





    // 检查 JWT 是否过期
    private static boolean isTokenExpired(String token) {
        Claims claims = parseToken(token);
        if (claims != null) {
            Date expiration = claims.getExpiration();
            return expiration != null && expiration.before(new Date());
        }
        return false;
    }

    // 解析 JWT 的方法
    private static Claims parseToken(String token) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            // 解析失败，可能是 token 无效、过期等原因
            System.err.println("Token 解析失败: " + e.getMessage());
            return null;
        }
    }

}